﻿using Farming.Domain;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Farming.EntityFrameworkCore
{
    public abstract class AuditDbContextBase
    {
    //    protected AuditDbContextBase()
    //    {
    //    }

    //    protected AuditDbContextBase(DbContextOptions<FarmingDbContext> dbContextOptions) : base(dbContextOptions)
    //    {
    //    }

    //    protected List<AuditFields> AuditEntries { get; set; }
    //    protected override Task BeforeSaveChanges()
    //    {
    //        AuditEntries = new List<AuditFields>();
    //        foreach (var entityEntry in ChangeTracker.Entries())
    //        {
    //            if (entityEntry.State == EntityState.Detached || entityEntry.State == EntityState.Unchanged)
    //            {
    //                continue;
    //            }
    //            AuditEntries.Add(new AuditFields(entityEntry));
    //        }

    //        return Task.CompletedTask;
    //    }
    //    protected override async Task AfterSaveChanges()
    //    {
    //        if (null != AuditEntries && AuditEntries.Count > 0)
    //        {
    //            foreach (var auditEntry in AuditEntries)
    //            {
    //                // update TemporaryProperties
    //                if (auditEntry.TemporaryProperties != null && auditEntry.TemporaryProperties.Count > 0)
    //                {
    //                    foreach (var temporaryProperty in auditEntry.TemporaryProperties)
    //                    {
    //                        var colName = temporaryProperty.Metadata.GetColumnName();
    //                        if (temporaryProperty.Metadata.IsPrimaryKey())
    //                        {
    //                            auditEntry.KeyValues[colName] = temporaryProperty.CurrentValue;
    //                        }

    //                        switch (auditEntry.OperationType)
    //                        {
    //                            case OperationType.Add:
    //                                auditEntry.NewValues[colName] = temporaryProperty.CurrentValue;
    //                                break;

    //                            case OperationType.Delete:
    //                                auditEntry.OriginalValues[colName] = temporaryProperty.OriginalValue;
    //                                break;

    //                            case OperationType.Update:
    //                                auditEntry.OriginalValues[colName] = temporaryProperty.OriginalValue;
    //                                auditEntry.NewValues[colName] = temporaryProperty.CurrentValue;
    //                                break;
    //                        }
    //                    }
    //                    // set to null
    //                    auditEntry.TemporaryProperties = null;
    //                }
    //            }
    //            // ... save audit entries
    //        }
    //    }


    }
}
